package br.edu.ufcg.p1.barzin.util;

import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_CATEGORIAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_ITENS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_MENSAGEM;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_PEDIDOS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_PEDIDOS_PESSOAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_PESSOAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.CREATE_TABLE_PROPAGANDAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DELETE_PESSOAS_PEDIDO;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_CATEGORIAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_ITENS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_MENSAGEM;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_PEDIDOS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_PEDIDO_PESSOAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_PESSOAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.DROP_TABLE_PROPAGANDA;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_CATEGORIA_POR_ID;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_IDS_CATEGORIAS_PRINCIPAIS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_ITEM_POR_ID;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_ITENS_PEDIDOS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_ITENS_POR_ID_CATEGORIA;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_MENSAGENS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_PEDIDOS_ATENDIDOS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_PEDIDOS_PENDENTES;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_PESSOAS_PEDIDO;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_SUBCATEGORIAS_POR_ID;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_TODAS_PESSOAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_TODAS_PROPAGANDAS;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_VALOR_CONTA;
import static br.edu.ufcg.p1.barzin.util.SQLUtils.SELECT_VALOR_PESSOA_POR_ID;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.BitmapFactory;
import android.util.Log;
import br.edu.ufcg.p1.barzin.model.ApagarMensagens;
import br.edu.ufcg.p1.barzin.model.Cardapio;
import br.edu.ufcg.p1.barzin.model.Categoria;
import br.edu.ufcg.p1.barzin.model.Item;
import br.edu.ufcg.p1.barzin.model.Mensagem;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Pessoa;
import br.edu.ufcg.p1.barzin.model.Propaganda;
import br.edu.ufcg.p1.barzin.model.Resumo;

public class DAO extends SQLiteOpenHelper {

	private static final String DATABASE_NAME = "barzin_db";

	private static final int DATABASE_VERSION = 8;

	public DAO(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		try {
			db.execSQL(CREATE_TABLE_PESSOAS);
			db.execSQL(CREATE_TABLE_PEDIDOS_PESSOAS);
			db.execSQL(CREATE_TABLE_CATEGORIAS);
			db.execSQL(CREATE_TABLE_ITENS);
			db.execSQL(CREATE_TABLE_PEDIDOS);
			db.execSQL(CREATE_TABLE_MENSAGEM);
			db.execSQL(CREATE_TABLE_PROPAGANDAS);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		try {
			db.execSQL(DROP_TABLE_PESSOAS);
			db.execSQL(DROP_TABLE_PEDIDO_PESSOAS);
			db.execSQL(DROP_TABLE_CATEGORIAS);
			db.execSQL(DROP_TABLE_ITENS);
			db.execSQL(DROP_TABLE_PEDIDOS);
			db.execSQL(DROP_TABLE_MENSAGEM);
			db.execSQL(DROP_TABLE_PROPAGANDA);
			this.onCreate(db);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	public Categoria recuperaCategoria(long idCategoria) {
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_CATEGORIA_POR_ID,
					new String[] { idCategoria + "" });
			c.moveToFirst();
			final Categoria cat = this.criaCategoria(c);
			c.close();

			final Cursor c2 = db.rawQuery(SELECT_SUBCATEGORIAS_POR_ID,
					new String[] { idCategoria + "" });
			final List<Categoria> subcategorias = new ArrayList<Categoria>();
			while (c2.moveToNext()) {
				final Categoria cat2 = this.criaCategoria(c2);
				subcategorias.add(cat2);
			}
			c2.close();

			final Cursor c3 = db.rawQuery(SELECT_ITENS_POR_ID_CATEGORIA,
					new String[] { idCategoria + "" });
			final List<Item> itens = new ArrayList<Item>();
			while (c3.moveToNext()) {
				final Item item = this.criaItem(c3);
				if (item != null) {
					itens.add(item);
				}
			}
			c3.close();

			cat.setSubcategorias(subcategorias);
			cat.setItens(itens);

			db.close();
			return cat;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	public void rebuildDb() {
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			db.execSQL(DROP_TABLE_PESSOAS);
			db.execSQL(DROP_TABLE_PEDIDO_PESSOAS);
			db.execSQL(DROP_TABLE_CATEGORIAS);
			db.execSQL(DROP_TABLE_ITENS);
			db.execSQL(DROP_TABLE_PEDIDOS);
			db.execSQL(DROP_TABLE_MENSAGEM);
			db.execSQL(DROP_TABLE_PROPAGANDA);

			db.execSQL(CREATE_TABLE_PESSOAS);
			db.execSQL(CREATE_TABLE_PEDIDOS_PESSOAS);
			db.execSQL(CREATE_TABLE_CATEGORIAS);
			db.execSQL(CREATE_TABLE_ITENS);
			db.execSQL(CREATE_TABLE_PEDIDOS);
			db.execSQL(CREATE_TABLE_MENSAGEM);
			db.execSQL(CREATE_TABLE_PROPAGANDAS);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	public Cardapio recuperaCardapio() {
		final List<Categoria> categorias = new ArrayList<Categoria>();
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db
					.rawQuery(SELECT_IDS_CATEGORIAS_PRINCIPAIS, null);
			while (c.moveToNext()) {
				final Categoria cat = this.criaCategoria(c);
				if (cat != null) {
					categorias.add(cat);
				}
			}
			c.close();
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return new Cardapio(categorias);
	}

	public boolean salvaCardapio(Cardapio cardapio) {
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			db.execSQL(DROP_TABLE_CATEGORIAS);
			db.execSQL(DROP_TABLE_ITENS);
			db.execSQL(CREATE_TABLE_CATEGORIAS);
			db.execSQL(CREATE_TABLE_ITENS);

			for(Categoria categoria : cardapio.getCategorias()) {
				Log.d("-- Categoria", "-- " + categoria.getNome()+"");
				for(Categoria subcategoria : categoria.getSubcategorias()) {
					Log.d("---- Subcategoria","---- " +  subcategoria.getNome()+"");
				}
				for (Item item : categoria.getItens()) {
					Log.d("---- Item","---- " +  item.getNome()+"");
				}
			}
			
			for (Categoria categoria : cardapio.getCategorias()) {
				Log.d("salvar categoria", categoria.getNome() + "->" + categoria.getCategoriaMaeId());
//				this.salvaCategoria(categoria, db);
				
				db.insert("Categorias", null, this.contentValuesBy(categoria));
				
				if (!categoria.getSubcategorias().isEmpty()) {
					for (Categoria subcategoria : categoria.getSubcategorias()) {
						Log.d("salvar subcategoria", subcategoria.getNome());
						db.insert("Categorias", null, this.contentValuesBy(subcategoria));
						
						if (!subcategoria.getItens().isEmpty()) {
							for (Item item : subcategoria.getItens()) {
								Log.d("salvar item", item.getNome());
								db.insert("Itens", null,
										this.contentValuesBy(item, subcategoria.getId()));
							}
						}
						
					}
				}

				if (!categoria.getItens().isEmpty()) {
					for (Item item : categoria.getItens()) {
						Log.d("salvar item", item.getNome());
						db.insert("Itens", null,
								this.contentValuesBy(item, categoria.getId()));
					}
				}
				
			}
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		}
		return true;
	}

	public boolean apagaMensagens(ApagarMensagens apagar) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();

			Log.d("no dao", "");

			for (String id : apagar.getIdsApagar()) {
				Log.d("no dao com id", id);
				db.delete("Mensagens", "remetente_id=?", new String[] { id });
				db.delete("Mensagens", "destinatario_id=?", new String[] { id });
			}

			db.close();
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		}
		return true;
	}

	private boolean salvaCategoria(Categoria categoria, SQLiteDatabase db) {
		try {
			Log.d("vou salvar a categoria" + categoria.getNome(), "sub: " + categoria.getSubcategorias().size() + ", Ite: " + categoria.getItens().size());
			db.insert("Categorias", null, this.contentValuesBy(categoria));

			for (Categoria subcategoria : categoria.getSubcategorias()) {
				Log.d("salvar subcategoria", subcategoria.getNome());
				this.salvaCategoria(subcategoria, db);
			}

			for (Item item : categoria.getItens()) {
				Log.d("salvar item", item.getNome());
				db.insert("Itens", null,
						this.contentValuesBy(item, categoria.getId()));
			}
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		}
		return true;
	}

	public List<Resumo> recuperaResumos() {
		final List<Resumo> resumos = new ArrayList<Resumo>();

		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_ITENS_PEDIDOS, null);
			while (c.moveToNext()) {
				Integer id = c.getInt(c.getColumnIndex("item_id"));
				Item item = this.recuperaItem(id, db);
				if (item != null) {
					Resumo resumo = recuperaResumo(item, db);
					if (resumo != null) {
						resumos.add(resumo);
					}
				}
			}
			c.close();
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return resumos;
	}

	private Item recuperaItem(Integer id, SQLiteDatabase db) {
		try {
			final Cursor c = db.rawQuery(SELECT_ITEM_POR_ID, new String[] { id
					+ "" });
			c.moveToFirst();
			Item item = this.criaItem(c);
			c.close();
			return item;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	private Resumo recuperaResumo(Item item, SQLiteDatabase db) {
		try {
			final Cursor c = db.rawQuery(SELECT_PEDIDOS_ATENDIDOS,
					new String[] { item.getId() + "" });
			List<Pedido> pedidosAtendidos = new ArrayList<Pedido>();
			while (c.moveToNext()) {
				Pedido pedido = this.criaPedido(c);
				if (pedido != null) {
					pedido.setPessoas(this.recuperaPessoas(pedido.getId(), db));
					pedido.setItem(item);
					pedidosAtendidos.add(pedido);
				}
			}
			c.close();

			final Cursor c2 = db.rawQuery(SELECT_PEDIDOS_PENDENTES,
					new String[] { item.getId() + "" });
			List<Pedido> pedidosPendentes = new ArrayList<Pedido>();
			while (c2.moveToNext()) {
				Pedido pedido = this.criaPedido(c2);
				pedido.setPessoas(this.recuperaPessoas(pedido.getId(), db));
				pedido.setItem(item);
				pedidosPendentes.add(pedido);
			}
			c2.close();
			return new Resumo(item, pedidosAtendidos, pedidosPendentes);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	public boolean salvaPessoa(Pessoa pessoa) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			long l = db.insert("Pessoas", null, this.contentValuesBy(pessoa));
			db.close();
			return l == -1 ? false : true;
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		}
	}

	public boolean salvaMensagens(List<Mensagem> mensagens) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			for (Mensagem mensagem2 : mensagens) {
				db.insert("Mensagens", null, this.contentValuesBy(mensagem2));
			}
			db.close();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return false;
	}

	public boolean salvaMensagem(Mensagem mensagem) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			long l = db.insert("Mensagens", null,
					this.contentValuesBy(mensagem));
			db.close();
			return l == -1 ? false : true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return false;
	}

	public List<Pessoa> recuperaPessoas() {
		final List<Pessoa> pessoas = new ArrayList<Pessoa>();

		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_TODAS_PESSOAS, null);
			while (c.moveToNext()) {
				final Pessoa p = this.criaPessoa(c);
				if (p != null) {
					p.setValor(this.getValorPessoa(p.getId(), db));
					pessoas.add(p);
				}
			}
			c.close();
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return pessoas;
	}

	public List<Mensagem> recuperaMensagens(Integer idRemetente,
			Integer idDestinatario) {
		final List<Mensagem> mensagens = new ArrayList<Mensagem>();
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_MENSAGENS, new String[] {
					idRemetente + "", idDestinatario + "" });
			while (c.moveToNext()) {
				final Mensagem m = this.criaMensagem(c);
				if (m != null) {
					mensagens.add(m);
				}
			}
			c.close();
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return mensagens;
	}

	private List<Pessoa> recuperaPessoas(Long idPedido, SQLiteDatabase db) {
		final List<Pessoa> pessoas = new ArrayList<Pessoa>();
		try {
			final Cursor c = db.rawQuery(SELECT_PESSOAS_PEDIDO,
					new String[] { idPedido + "" });
			while (c.moveToNext()) {
				final Pessoa p = this.criaPessoa(c);
				if (p != null) {
					p.setValor(this.getValorPessoa(p.getId(), db));
					pessoas.add(p);
				}
			}
			c.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return pessoas;
	}

	private double getValorPessoa(int id, SQLiteDatabase db) {
		try {
			final Cursor c = db.rawQuery(SELECT_VALOR_PESSOA_POR_ID,
					new String[] { id + "" });
			c.moveToFirst();
			double valor = c.getDouble(c.getColumnIndex("valor"));
			valor = Math.round(valor * 100.0) / 100.0;
			c.close();
			return valor;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return 0;
	}

	public boolean removePessoa(Pessoa pessoa) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			db.delete("Pessoas", "id=?", new String[] { pessoa.getId() + "" });
			db.close();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		}
	}

	public double totalConta() {
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_VALOR_CONTA, null);
			c.moveToFirst();
			double valor = c.getDouble(c.getColumnIndex("valor"));
			valor = Math.round(valor * 100.0) / 100.0;
			c.close();
			db.close();
			return valor;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return 0;
	}

	public boolean salvaPedido(Pedido pedido) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			db.insert("Pedidos", null, this.contentValuesBy(pedido));

			for (Pessoa pessoa : pedido.getPessoas()) {
				db.insert("PedidosPessoas", null,
						this.contentValuesBy(pedido, pessoa));
			}

			db.close();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return false;
	}

	public boolean alteraPedido(Pedido pedido) {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			db.update("Pedidos", this.contentValuesBy(pedido), "id=?",
					new String[] { pedido.getId() + "" });
			db.execSQL(DELETE_PESSOAS_PEDIDO, new String[] { pedido.getId()
					+ "" });
			for (Pessoa pessoa : pedido.getPessoas()) {
				db.insert("PedidosPessoas", null,
						this.contentValuesBy(pedido, pessoa));
			}
			db.close();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return false;
	}

	public boolean limpaDados() {
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			db.delete("Pessoas", null, null);
			db.delete("PedidosPessoas", null, null);
			db.delete("Pedidos", null, null);
			db.delete("Mensagens", null, null);
			db.close();
		} catch (NullPointerException npe) {

		} catch (Exception e) {
			// TODO: handle exception
		}
		return true;
	}

	private Categoria criaCategoria(Cursor c) {
		try {
			return new Categoria(c.getInt(c.getColumnIndex("id")), c.getInt(c
					.getColumnIndex("categoria_mae_id")), c.getString(c
					.getColumnIndex("nome")), null, null);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	private Item criaItem(Cursor c) {
		try {
			boolean disponivel = c.getInt(c.getColumnIndex("disponivel")) == 1 ? true
					: false;
			boolean precisaPreparo = c.getInt(c
					.getColumnIndex("precisa_preparo")) == 1 ? true : false;

			Item item = new Item(c.getInt(c.getColumnIndex("id")),
					c.getString(c.getColumnIndex("nome")), c.getString(c
							.getColumnIndex("descricao")), c.getDouble(c
							.getColumnIndex("preco")), disponivel,
					precisaPreparo);

			byte[] tumb = c.getBlob(c.getColumnIndex("thumb"));
			if (tumb != null) {
				item.setThumb(BitmapFactory.decodeByteArray(tumb, 0,
						tumb.length));
			}

			byte[] foto = c.getBlob(c.getColumnIndex("foto"));
			if (foto != null) {
				item.setFoto(BitmapFactory
						.decodeByteArray(foto, 0, foto.length));
			}

			return item;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	private Propaganda criaPropaganda(Cursor c) {
		try {

			Propaganda p = new Propaganda(c.getColumnIndex("id"));
			
			byte[] foto = c.getBlob(c.getColumnIndex("foto"));
			if (foto != null) {
				p.setFoto(BitmapFactory
						.decodeByteArray(foto, 0, foto.length));
			}

			return p;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	private Pessoa criaPessoa(Cursor c) {
		try {
			return new Pessoa(c.getInt(c.getColumnIndex("id")), c.getString(c
					.getColumnIndex("nome")), null);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	

	private Pedido criaPedido(Cursor c) {
		try {
			return new Pedido(c.getLong(c.getColumnIndex("id")), null,
					c.getInt(c.getColumnIndex("quantidade")), null,
					c.getString(c.getColumnIndex("estado")), c.getString(c
							.getColumnIndex("hora_formatado")));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	private Mensagem criaMensagem(Cursor c) {
		try {
			return new Mensagem(c.getInt(c.getColumnIndex("id")), c.getInt(c
					.getColumnIndex("remetente_id")), c.getInt(c
					.getColumnIndex("destinatario_id")), c.getString(c
					.getColumnIndex("remetente_nome")), c.getString(c
					.getColumnIndex("mensagem")), c.getString(c
					.getColumnIndex("hora_formatado")));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	public boolean salvaPropagandas(List<Propaganda> propagandas) {
		Log.d("--", "SalvaPropagandas");
		try {
			SQLiteDatabase db = this.getWritableDatabase();
			
			for (Propaganda p : propagandas) {
				Log.d("-", "inserts");
				db.insert("Propaganda", null, this.contentValuesBy(p));
			}
			
			db.close();
			return true;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return false;
	}
	
	public List<Propaganda> recuperaPropagandas() {
		final List<Propaganda> propagandas = new ArrayList<Propaganda>();

		Log.d("--", ">><<");
		
		try {
			final SQLiteDatabase db = this.getReadableDatabase();
			final Cursor c = db.rawQuery(SELECT_TODAS_PROPAGANDAS, null);
			while (c.moveToNext()) {
				final Propaganda p = this.criaPropaganda(c);
				if (p != null) {
					Log.d("pp", "add");
					propagandas.add(p);
				}
			}
			c.close();
			db.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return propagandas;
	}
	
	private ContentValues contentValuesBy(Mensagem m) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("id", m.getId());
			cv.put("remetente_id", m.getIdRemetente());
			cv.put("destinatario_id", m.getIdDestinatario());
			cv.put("remetente_nome", m.getNomeRemetente());
			cv.put("mensagem", m.getMensagem());
			cv.put("hora_formatado", m.getHorario());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}

	private ContentValues contentValuesBy(Categoria c) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("id", c.getId());
			cv.put("nome", c.getNome());
			cv.put("categoria_mae_id", c.getCategoriaMaeId());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}

	private ContentValues contentValuesBy(Item i, Integer categoria_id) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("id", i.getId());
			cv.put("nome", i.getNome());
			cv.put("descricao", i.getDescricao());
			cv.put("preco", i.getPreco());
			cv.put("precisa_preparo", i.isPrecisaPreparo() ? 1 : 0);
			cv.put("disponivel", i.isDisponivel() ? 1 : 0);
			cv.put("foto", (i.getFoto() != null) ? i.getFotoByteArray() : null);
			cv.put("thumb", (i.getThumb() != null) ? i.getThumbByteArray()
					: null);
			cv.put("categoria_id", categoria_id);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}

	private ContentValues contentValuesBy(Propaganda p) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("foto", (p.getFoto() != null) ? p.getFotoByteArray() : null);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}
	
	private ContentValues contentValuesBy(Pessoa p) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("nome", p.getNome());
			cv.put("valor", p.getValor());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}

	private ContentValues contentValuesBy(Pedido p) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("id", p.getId());
			cv.put("quantidade", p.getQuantidade());
			cv.put("item_id", p.getItemId());
			cv.put("estado", p.getEstado());
			cv.put("hora_formatado", p.getHorario());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}

	private ContentValues contentValuesBy(Pedido pedido, Pessoa pessoa) {
		final ContentValues cv = new ContentValues();
		try {
			cv.put("pedido_id", pedido.getId());
			cv.put("pessoa_id", pessoa.getId());
			cv.put("valor", pedido.getParcelaPorPessoa());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cv;
	}
}
